/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Main;

import java.awt.geom.Point2D;
import java.io.*;
import lejos.nxt.*;
import lejos.nxt.comm.*;

/**
 *
 * @author Olli
 */
/**
 * 
 * BTOrja kuuntelee mahdollista yhteydenottoa tietokoneelta
 * Yhdistämisen jälkeen luetaan data streamista ja kirjoitetaan uusi data streamiin
 */
public class BTOrja extends Thread {

    private final String connected;
    private final String waiting;
    private DataInputStream dis;
    private DataOutputStream dos;
    private BTConnection btc;
    private BTPaketti paketti;
    private int tempEtaisyydet[];
    private volatile boolean yhdistetty;
    private volatile boolean muuttunut;
    private volatile boolean luku;
    private volatile boolean kirjoitus;

    BTOrja() {
        this.connected = "Yhdistetty!";
        this.waiting = "Odotetaan yhteytta...";
        this.yhdistetty = false;

        this.paketti = new BTPaketti(-1); //Robotti ei ole saanut vielä omaa ID:ta
        this.muuttunut = true;
        this.luku = true;
        this.kirjoitus = false;
        this.muuttunut = false;
        alustaYhteys();
    }

    @Override
    public void run() {
        while (true) {
            if (yhdistetty) {
                try {
                    try {
                        if (luku) {
                            paketti.setId(dis.readInt());
                           // System.out.println("ID luettu");
                            paketti.setNykySijainti(new Point2D.Float(dis.readFloat(), dis.readFloat()));
                           // System.out.println("Nykysijainti Luettu");
                            paketti.setUusiSijainti(new Point2D.Float(dis.readFloat(), dis.readFloat()));
                           // System.out.println("uusi sijainti luettu");
                            paketti.setMittausSuunta(new Point2D.Float(dis.readFloat(), dis.readFloat()));
                            //System.out.println("Mittaussuunnat luettu");
                            muuttunut = true;
                            luku = false;
                        }
                        /* System.out.println("MittausSuunta: " + paketti.getMittausSuunta().x + " " + +paketti.getMittausSuunta().y);
                        System.out.println("MittausSuunta: " + paketti.getNykySijainti().x + " " + +paketti.getNykySijainti().y);
                        System.out.println("MittausSuunta: " + paketti.getUusiSijainti().x + " " + +paketti.getUusiSijainti().y);*/

                    } catch (IOException ex) {
                        LCD.clear();
                        LCD.drawString("Heikosti menee", 10, 10);
                        LCD.refresh();
                    }
                    try {

                        if (kirjoitus) {
                         //   System.out.println("#######KIRJOITUS ALKAA#######");
                            dos.writeInt(paketti.getId());
                            dos.flush();
                    //        Thread.sleep(50);
                          //  System.out.println("ID kirjoitettu");
                            tempEtaisyydet = paketti.getEtaisyydet();

                            //Kirjoitetaan etäisyydet streamiin
                            for (int i = 0; i < BTPaketti.MAARA; i++) {
                                dos.writeInt(tempEtaisyydet[i]);
                                dos.flush();
                      //          Thread.sleep(50);
                             //   System.out.println("Etaisyys lahetetty");
                            }

                            dos.writeFloat(paketti.getNykySijainti().x);
                            dos.flush();
                        //    Thread.sleep(50);
                            System.out.println("nykysijainti x kirjoitettu");
                            dos.writeFloat(paketti.getNykySijainti().y);
                            dos.flush();
                          //  Thread.sleep(50);
                            System.out.println("nykysijainti y kirjoitettu");
                            dos.writeFloat(paketti.getUusiSijainti().x);
                            dos.flush();
                            //Thread.sleep(50);
                            System.out.println("uusi sijainti x kirjoitettu");
                            dos.writeFloat(paketti.getUusiSijainti().y);
                            dos.flush();
                            //Thread.sleep(50);
                            System.out.println("uusi sijainti y  kirjoitettu");
                            dos.writeFloat(paketti.getMittausSuunta().x);
                            dos.flush();
                            //Thread.sleep(50);
                            System.out.println("getMittausSuunta x kirjoitettu");
                            dos.writeFloat(paketti.getMittausSuunta().y);
                            dos.flush();
                            //Thread.sleep(50);
                            System.out.println("getMittausSuunta y kirjoitettu");
                            kirjoitus = false;
                        }
                    } catch (IOException ex) {
                        LCD.clear();
                        LCD.drawString("Vituiks meni", 10, 10);
                        LCD.refresh();
                    }
                } catch (Exception e) {
                    System.out.println("Thread.sleep 50ms kusi");
                }
            }
        }
    }

    private void alustaYhteys() {
        LCD.drawString(waiting, 0, 0);
        LCD.refresh();
        this.btc = Bluetooth.waitForConnection();

        System.out.println("paskaa");

        LCD.clear();
        LCD.drawString(connected, 0, 0);
        LCD.refresh();

        yhdistetty = true;
        this.dis = btc.openDataInputStream();
        this.dos = btc.openDataOutputStream();

        LCD.clear();
        System.out.println("dis ja dos alustettu");
    }

    public void asetaPaketti(BTPaketti paketti) {
        this.paketti = paketti;
    }

    public BTPaketti haePaketti() {
        luku = true;
        muuttunut = false;
        while (!muuttunut) {
        }

        return this.paketti;
    }

    void viePaketti(BTPaketti paketti) {
        this.paketti = paketti;
        kirjoitus = true;
    }
}
